home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Network CD 1
/
Network CD.iso
/
others
/
emit
/
aprintf.asm
next >
Wrap
Assembly Source File
|
1988-01-30
|
3KB
|
98 lines
* ------------------------------------------------------------------------- *
* Aprintf.asm
* Copyright Justin V. McCormick 1988
* ------------------------------------------------------------------------- *
TTL aprintf.asm
SECTION aprintf,CODE
NOLIST
include "macros.i"
; include "libraries/dos_lib.i"
; include "exec/exec_lib.i"
* Equates replacing above files includes
_LVORawDoFmt EQU $FFFFFDF6
_LVOWrite EQU $FFFFFFD0
LIST
* Externals
XREF _cliout ;CLI standard output filehandle, LONG
XREF _DOSBase ;Pointer to DOSBase, LONG
* ------------------------------------------------------------------------- *
* void aprintf(formatstring, args)
* char *formatstring;
* char **args;
*
* Synopsis: Given formatstring and args to format, prints output to current
* terminal output channel, globally defined as _cliout, where:
*
* LONG cliout;
* cliout = Output();
*
* No error checking is performed for cliout pointing to a valid filehandle,
* i.e., you must initialize cliout before calling aprintf(). _DOSBase must
* be initialized as:
* struct DOSBase *DOSBase;
* DOSBase = (struct DOSBase *)OpenLibrary("dos.library", 33L);
* ------------------------------------------------------------------------- *
XDEF _aprintf
_aprintf:
link a5,#-512 ;Allocate 512 bytes on stack
movem.l d0/d1/a0-a3,-(sp) ;Save everything we might clobber
* Call format function to convert fmtstring and args to buffer on the stack
movea.l 8(a5),a0 ;Grab format string
lea 12(a5),a1 ;Grab EA of arguments
lea kput1(pc),a2 ;Grab EA of output subroutine
lea -512(a5),a3 ;Grab EA of temp workspace
SYS RawDoFmt,4 ;Format it into workspace
* Calculate length of resulting string, output to console CLI
lea -512(a5),a0 ;a0 = Start of buffer
move.l a0,d2 ;Copy for output
bsr.s astrlen ;Calculate string length
move.l d0,d3 ;length of string
move.l _cliout,d1 ;Filehandle
SYS Write,_DOSBase ;Dump the string to stdout
movem.l (sp)+,d0/d1/a0-a3 ;Restore registers
unlk a5 ;And stack frame
rts
* ------------------------------------------------------------------------- *
* RawDoFmt() output routine for aprintf, called for each formatted char.
* Takes byte in d0 and puts in buffer pointed to by a3, then increments a3.
* ------------------------------------------------------------------------- *
XDEF kput1
kput1:
move.b d0,(a3)+
rts
* ------------------------------------------------------------------------- *
* LONG astrlen(string)
* d0 a0
* char *string;
*
* Synopsis: Calculate length of null-byte terminated string.
*
* Modifies: d0 = length of string, a0 = next byte address after zero byte.
* ------------------------------------------------------------------------- *
XDEF astrlen
astrlen:
moveq #0,d0 ;Clear count
1$
tst.b (a0)+ ;Test a byte for zero-ness
beq.s 2$ ;Found it! return length
addq.w #1,d0 ;Otherwise bump count
bra.s 1$ ;Check next byte
2$
rts
* ------------------------------------------------------------------------- *
END